/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import modelo.*;
import util.ControlaConexao;

/**
 *
 * @author Professor
 */
public class TecnicoDAO {

    private Connection conexao;
    private PreparedStatement instrucao;
    private ResultSet resultados;

    //inserir
    public void inserir(Tecnico tecnico) {
        try {
            this.conexao = new ControlaConexao().getConexao();

            System.out.println("conectado com sucesso");
            String sql = "CALL INSERIR_TECNICO(?,?,?,?,?)";
            instrucao = conexao.prepareStatement(sql);
            System.out.println("instrução iniciada");
            this.instrucao.setLong(1, tecnico.getAreaTecnica().getId());
            this.instrucao.setLong(2, tecnico.getNivelTecnico().getId());
            this.instrucao.setString(3, tecnico.getNome());
            this.instrucao.setString(4, tecnico.getJornadaTrabalho());
            this.instrucao.setString(5, tecnico.getCpf());
            instrucao.execute();
            
        } catch (Exception e) {
            System.out.println("Erro de banco de Dados: " + e.getMessage());
        } finally {
            ControlaConexao.fecharInstrucao(instrucao);
            System.out.println("instrucao terminada");
            ControlaConexao.fecharConexao(conexao);
            System.out.println("conexao terminada");
        }

    }
    //alterar

    public void alterar(Tecnico tecnico) {

        try {

            conexao = new ControlaConexao().getConexao();
            String sql = "CALL ALTERAR_TECNICO(?,?,?,?,?,?)";
            instrucao = conexao.prepareStatement(sql);

            System.out.println("instrução iniciada");
            this.instrucao.setLong(1, tecnico.getId());
            this.instrucao.setLong(2, tecnico.getAreaTecnica().getId());
            this.instrucao.setLong(3, tecnico.getNivelTecnico().getId());
            this.instrucao.setString(4, tecnico.getNome());
            this.instrucao.setString(5, tecnico.getJornadaTrabalho());
            this.instrucao.setString(6, tecnico.getCpf());

            instrucao.execute();

            System.out.println("Alterado com sucesso!");

            instrucao.close();

            conexao.close();

        } catch (Exception e) {

            System.out.println("Erro de Banco de Dados: " + e.getMessage());
        } finally {
            ControlaConexao.fecharInstrucao(instrucao);
            ControlaConexao.fecharConexao(conexao);
        }

    }
    //excluir
    public void excluir(Tecnico tecnico) {

        try {

            conexao = new ControlaConexao().getConexao();

            String sql = "Call EXCLUIR_TECNICO(?)";
            instrucao = conexao.prepareStatement(sql);

            instrucao.setLong(1, tecnico.getId());

            instrucao.execute();

            System.out.println("exclusão realizada com sucesso!");

        } catch (Exception e) {

            System.out.println("Erro de Banco de Dados: " + e.getMessage());

        } finally {
            ControlaConexao.fecharInstrucao(instrucao);
            ControlaConexao.fecharConexao(conexao);
        }

    }
    //consultar
     public Tecnico consultar(Tecnico tecnico) {


        try {

            this.conexao = new ControlaConexao().getConexao();

            String sql = "CALL CONSULTAR_TECNICO(?)";

            instrucao = conexao.prepareStatement(sql);

            instrucao.setLong(1, tecnico.getId());

            instrucao.executeUpdate();

            resultados = instrucao.getResultSet();

            while (resultados.next()) {
                tecnico.setId(Long.parseLong(resultados.getString("tec_id")));
                tecnico.setNome(resultados.getString("tec_nome"));
            }

        } catch (Exception e) {

            System.out.println("Erro de Banco de Dados: " + e.getMessage());
        } finally {
            ControlaConexao.fecharResultados(resultados);
            ControlaConexao.fecharInstrucao(instrucao);
            ControlaConexao.fecharConexao(conexao);
        }

        return tecnico;

    }

    //pesquisar
     public List<Tecnico> pesquisar(Tecnico tecnico) {

        List<Tecnico> tecnicos = new ArrayList<Tecnico>();

        try {

            conexao = new ControlaConexao().getConexao();

            String sql = "Call PESQUISAR_USUARIO(?)";

            instrucao = conexao.prepareStatement(sql);

            instrucao.setString(1, tecnico.getNome());
            

            instrucao.executeUpdate();

            System.out.println("Pesquisa completa");
            resultados = instrucao.getResultSet();

            while (resultados.next()) {

                Tecnico tecnicoEncontrado = new Tecnico();

                tecnicoEncontrado.setId(Long.parseLong(resultados.getString("tec_id")));
                tecnicoEncontrado.setNome(resultados.getString("tec_nome"));
                tecnicoEncontrado.setCpf(resultados.getString("tec_cpf"));
                AreaTecnica areaTecnica= new AreaTecnica();
                areaTecnica.setId(resultados.getLong("tec_area_id"));
                tecnicoEncontrado.setAreaTecnica(areaTecnica);
                NivelTecnico nivelTecnico= new NivelTecnico();
                nivelTecnico.setId(resultados.getLong("tec_nt_id"));
                tecnicoEncontrado.setNivelTecnico(nivelTecnico);
                tecnicoEncontrado.setJornadaTrabalho(resultados.getString("tec_jornada_trabalho"));

            }

        } catch (Exception e) {

            System.out.println("Erro de Banco de Dados: " + e.getMessage());
        } finally {
            ControlaConexao.fecharResultados(resultados);
            ControlaConexao.fecharInstrucao(instrucao);
            ControlaConexao.fecharConexao(conexao);
        }
        return tecnicos;
    }
}
